package com.define.commons.quartz.utils;

import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import java.io.File;
import java.util.ArrayList;

/**
 * 动态编译工具类
 * @Author xiewenlong
 * @Date 2018/11/23 16:27
 */
public class DynamicCompilerUtil {

    /**
     * 对某个目录下的java文件进行编译
     * path:编译的目录
     * sourcePath:资源目录（需要使用的jar路径）
     */
    public static void compiler(String path, String sourcePath) throws Exception {
        File taskFile = new File(path);
        JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
        StandardJavaFileManager standardFileManager = javaCompiler.getStandardFileManager(null, null, null);
        Iterable<? extends JavaFileObject> javaFileObjects = standardFileManager.getJavaFileObjects(taskFile.listFiles((dir, name) -> name.endsWith(".java")));
        //设置编译参数
        ArrayList<String> ops = new ArrayList<String>();
        ops.add("-Xlint:unchecked");
        //设置classpath
        ops.add("-classpath");
        ops.add(DynamicCompilerUtil.getJarFiles(sourcePath, path));
        //获取编译任务
        JavaCompiler.CompilationTask task = javaCompiler.getTask(null, standardFileManager, null, ops, null, javaFileObjects);
        //执行编译任务
        task.call();
    }

    /**
     * 查找该目录下的所有的jar文件 带上class文件
     */
    public static String getJarFiles(String jarPath, String classPath) throws Exception {
        StringBuilder jars = new StringBuilder();
        File sourceFile = new File(jarPath);
        if (sourceFile.exists() && sourceFile.isDirectory()) {
            File[] files = sourceFile.listFiles();
            for (File file : files) {
                if(file.isFile() && file.getName().endsWith(".jar")){
                    jars.append(file.getPath() + ";");
                }
            }
            jars.append(classPath + ";");
        }
        return jars.toString();
    }
}
